package org.andengine.audio.sound;

import android.content.Context;
import android.content.res.AssetFileDescriptor;

import java.io.File;
import java.io.FileDescriptor;
import java.io.IOException;

/**
 * (c) 2010 Nicolas Gramlich
 * (c) 2011 Zynga Inc.
 *
 * @author Nicolas Gramlich
 * @since 14:23:03 - 11.03.2010
 */
public class SoundFactory {
    // ===========================================================
    // Constants
    // ===========================================================

    // ===========================================================
    // Fields
    // ===========================================================

    private static String sAssetBasePath = "";

    // ===========================================================
    // Constructors
    // ===========================================================

    // ===========================================================
    // Getter & Setter
    // ===========================================================

    /**
     * @param pAssetBasePath must end with '<code>/</code>' or have <code>.length() == 0</code>.
     */
    public static void setAssetBasePath(final String pAssetBasePath) {
        if (pAssetBasePath.endsWith("/") || pAssetBasePath.length() == 0) {
            SoundFactory.sAssetBasePath = pAssetBasePath;
        } else {
            throw new IllegalStateException("pAssetBasePath must end with '/' or be lenght zero.");
        }
    }

    public static String getAssetBasePath() {
        return SoundFactory.sAssetBasePath;
    }

    public static void onCreate() {
        SoundFactory.setAssetBasePath("");
    }

    // ===========================================================
    // Methods for/from SuperClass/Interfaces
    // ===========================================================

    // ===========================================================
    // Methods
    // ===========================================================

    public static Sound createSoundFromPath(final SoundManager pSoundManager, final String pPath) {
        synchronized (pSoundManager) {
            final int soundID = pSoundManager.getSoundPool().load(pPath, 1);
            final Sound sound = new Sound(pSoundManager, soundID);
            pSoundManager.add(sound);
            return sound;
        }
    }

    public static Sound createSoundFromAsset(final SoundManager pSoundManager, final Context pContext, final String pAssetPath) throws IOException {
        synchronized (pSoundManager) {
            final int soundID = pSoundManager.getSoundPool().load(pContext.getAssets().openFd(SoundFactory.sAssetBasePath + pAssetPath), 1);
            final Sound sound = new Sound(pSoundManager, soundID);
            pSoundManager.add(sound);
            return sound;
        }
    }

    public static Sound createSoundFromResource(final SoundManager pSoundManager, final Context pContext, final int pSoundResID) {
        synchronized (pSoundManager) {
            final int soundID = pSoundManager.getSoundPool().load(pContext, pSoundResID, 1);
            final Sound sound = new Sound(pSoundManager, soundID);
            pSoundManager.add(sound);
            return sound;
        }
    }

    public static Sound createSoundFromFile(final SoundManager pSoundManager, final File pFile) {
        return SoundFactory.createSoundFromPath(pSoundManager, pFile.getAbsolutePath());
    }

    public static Sound createSoundFromAssetFileDescriptor(final SoundManager pSoundManager, final AssetFileDescriptor pAssetFileDescriptor) {
        synchronized (pSoundManager) {
            final int soundID = pSoundManager.getSoundPool().load(pAssetFileDescriptor, 1);
            final Sound sound = new Sound(pSoundManager, soundID);
            pSoundManager.add(sound);
            return sound;
        }
    }

    public static Sound createSoundFromFileDescriptor(final SoundManager pSoundManager, final FileDescriptor pFileDescriptor, final long pOffset, final long pLength) {
        synchronized (pSoundManager) {
            final int soundID = pSoundManager.getSoundPool().load(pFileDescriptor, pOffset, pLength, 1);
            final Sound sound = new Sound(pSoundManager, soundID);
            pSoundManager.add(sound);
            return sound;
        }
    }

    // ===========================================================
    // Inner and Anonymous Classes
    // ===========================================================
}
